package org.hilo.boot.app.web;

import java.util.concurrent.CountDownLatch;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * web容器启动时，执行初始化操作
 * 
 * @author zollty
 * @since 2017年9月7日
 */
public class AppWebListener implements ServletContextListener {
    private static String contextPath;
    private static String webRealPath;
    private static CountDownLatch latch = new CountDownLatch(1);
    
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        contextPath = servletContext.getContextPath();
        webRealPath = servletContext.getRealPath("/");
        servletContext.log("get contextPath: " + contextPath);
        servletContext.log("get webRealPath: " + webRealPath);
        latch.countDown();
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        
    }
    
    /**
     * 等待初始化完成，某些情况下ServletContextListener的执行晚于spring容器的初始化完成,<br/>
     * 所以会造成当spring初始化完成后，才会调用 本类的执行，这个时候就要用异步线程调用本方法等待其执行完。
     */
    public static void waitForInit() {
        try {
            latch.await();
        } catch (InterruptedException e) {
            // ignore
        }
    }

    /**
     * @return ContextPath 即网站的 root url，通常为 "'/'+war包的名称" 或者 ""
     */
    public static String getContextPath() {
        return contextPath;
    }

    /**
     * @return web RealPath 即 网站根目录的物理路径，例如 E:\git\eadf-admin\src\main\webapp\，注意和${catalina.base}是有区别的。
     */
    public static String getWebRealPath() {
        return webRealPath;
    }

}
